package br.com.commerce.dao;

import java.io.Serializable;
import java.util.Collection;
import java.util.List;
import java.util.Map;

import org.hibernate.Criteria;
import org.hibernate.Session;

import br.com.commerce.entity.AbstractBaseEntity;

/**
 * 
 *
 * @param <T>
 */
public interface ManutencaoManager<T extends  AbstractBaseEntity> {

    /**
     * 
     * @param entidade
     */
    public AbstractBaseEntity inserir(T entidade);
    
    /**
	 * 
	 * @param entidade
	 */
	public void salvar(T entidade);

	/**
	 * 
	 * @param entidade
	 */
	public void excluir(T entidade);

	/**
	 * 
	 * @param id
	 * @return
	 */
	public T obter(Serializable id);
	
	/**
	 * Executa o criteria e tenta garantir que não encontre elementos duplicados
	 * @param criteria
	 * @return
	 */
	public   Collection<T> obter(Criteria criteria);
	
	/**
	 * 
	 * @param params
	 * @param orderBy
	 * @param order
	 * @return
	 * @throws RuntimeException
	 */
	public   Collection<T> obter(Map<String,Object> params,String orderBy,Boolean order) throws RuntimeException;

	/**
	 * 
	 * @param params
	 * @param orderBy
	 * @return
	 */
	public Collection<T> obter(Map<String,Object> params,String orderBy);

	/**
	 * 
	 * @param params
	 * @return
	 * @throws RuntimeException
	 */
	public T obter(Map<String,Object> params) throws RuntimeException;

	/**
	 * 
	 * @return
	 */
	public List<T> obterTodos();

	/**
	 * 
	 * @return Session
	 */
	public Session getSessionOfHibernate();
	
	/**
	 * 
	 * @param entidade
	 */
	public  void refresh(T entidade);

}